# -*- coding: utf-8 -*-
"""
Program to add uncat template to images without categories at commons.
See imagerecat.py (still working on that one) to add these images to categories.

"""
__version__ = '$Id: imageuncat.py 6022 2008-10-25 23:48:32Z multichill $'
#
#  (C) Multichill 2008
#
# Distributed under the terms of the MIT license.
#
#

import os, sys, re, codecs
import wikipedia, config, pagegenerators, query
from datetime import datetime
from datetime import timedelta

#Probably unneeded because these are hidden categories. Have to figure it out.
ignoreCategories = [u'[[Category:CC-BY-SA-3.0]]',
                    u'[[Category:GFDL]]',
                    u'[[Category:Media for cleanup]]',
                    u'[[Category:Media lacking a description]]',
                    u'[[Category:Media lacking author information]]',
                    u'[[Category:Media lacking a description]]',
                    u'[[Category:Self-published work]]']

#Dont bother to put the template on a image with one of these templates
skipTemplates = [u'Delete',
                 u'Nocat',
                 u'No license',
                 u'No permission since',
                 u'No source',
                 u'No source since',
                 u'Uncategorized',
                 u'Uncat']

#Ignore the templates in this really long list when looking for relevant categories
ignoreTemplates = [ u'1000Bit',
                    u'1922 cyc',
                    u'2MASS',
                    u'Aa',
                    u'Ab',
                    u'AbuGhraibPic',
                    u'ADRM',
                    u'ADRM2',
                    u'AerialPhotograph-mlitJP',
                    u'Af',
                    u'Agência Brasil',
                    u'AgenciaBrasil',
                    u'AgenciaCamaraBr',
                    u'AgenciaSenadoBr',
                    u'Ak',
                    u'AL2TB',
                    u'Alabordache',
                    u'Alexj2002C220PD',
                    u'Alexj2002InkscapePD',
                    u'Aln',
                    u'Als',
                    u'Am',
                    u'An',
                    u'Ang',
                    u'Anonymous work',
                    u'AnotherAuthor',
                    u'Apache',
                    u'Ar',
                    u'Arc',
                    u'Arn',
                    u'Artistic-2',
                    u'As',
                    u'Ashipilin',
                    u'AskedForInfo',
                    u'Ast',
                    u'AstronautPhoto',
                    u'Attribution',
                    u'Attribution Entomart',
                    u'Attribution-Ubisoft',
                    u'Auroranorthlicense',
                    u'Author-de',
                    u'Autorisation photos aériennes Francis Leroy',
                    u'Autotravel',
                    u'Av',
                    u'Avk',
                    u'Ay',
                    u'Az',
                    u'Ba',
                    u'Bad name',
                    u'BadJPEG',
                    u'Bar',
                    u'Bat-smg',
                    u'Bcl',
                    u'Be',
                    u'Be-tarask',
                    u'Be-x-old',
                    u'BeeldbankVenW',
                    u'Bg',
                    u'Bh',
                    u'Bi',
                    u'Blue Marble',
                    u'Bm',
                    u'Bmz',
                    u'Bn',
                    u'Bo',
                    u'Botev license',
                    u'Botev relicensed',
                    u'BotMoveToCommons',
                    u'Bpy',
                    u'Br',
                    u'Bs',
                    u'BSD',
                    u'BSDwithdisclaimer',
                    u'Byp',
                    u'C0',
                    u'Ca',
                    u'CatedralDeSal',
                    u'Cc',
                    u'CC-AR-Presidency',
                    u'Cc-by',
                    u'Cc-by-1.0',
                    u'Cc-by-1.0-nl',
                    u'Cc-by-2.0',
                    u'Cc-by-2.0-at',
                    u'Cc-by-2.0-be',
                    u'Cc-by-2.0-br',
                    u'Cc-by-2.0-cl',
                    u'Cc-by-2.0-de',
                    u'Cc-by-2.0-es',
                    u'Cc-by-2.0-fr',
                    u'Cc-by-2.0-it',
                    u'Cc-by-2.0-kr',
                    u'Cc-by-2.0-nl',
                    u'Cc-by-2.0-uk',
                    u'Cc-by-2.1-au',
                    u'Cc-by-2.1-es',
                    u'Cc-by-2.1-jp',
                    u'Cc-by-2.5',
                    u'Cc-by-2.5-bg',
                    u'Cc-by-2.5-br',
                    u'Cc-by-2.5-dk',
                    u'Cc-by-2.5-es',
                    u'Cc-by-2.5-in',
                    u'Cc-by-2.5-it',
                    u'Cc-by-2.5-my',
                    u'Cc-by-2.5-nl',
                    u'Cc-by-2.5-pl',
                    u'Cc-by-2.5-se',
                    u'Cc-by-2.5,2.0,1.0',
                    u'Cc-by-3.0',
                    u'Cc-by-3.0-gr',
                    u'Cc-by-3.0-IndiaFM',
                    u'Cc-by-3.0-nl',
                    u'Cc-by-3.0-rs',
                    u'Cc-by-3.0-us',
                    u'Cc-by-3.0,2.5,2.0,1.0',
                    u'Cc-by-all',
                    u'Cc-by-nc-sa-2.0-dual',
                    u'Cc-by-sa',
                    u'Cc-by-sa-1.0',
                    u'Cc-by-sa-1.0-fi',
                    u'Cc-by-sa-1.0-tw',
                    u'Cc-by-sa-2.0',
                    u'Cc-by-sa-2.0-at',
                    u'Cc-by-sa-2.0-au',
                    u'Cc-by-sa-2.0-be',
                    u'Cc-by-sa-2.0-br',
                    u'Cc-by-sa-2.0-ca',
                    u'Cc-by-sa-2.0-cl',
                    u'Cc-by-sa-2.0-de',
                    u'Cc-by-sa-2.0-es',
                    u'Cc-by-sa-2.0-fr',
                    u'Cc-by-sa-2.0-it',
                    u'Cc-by-sa-2.0-kr',
                    u'Cc-by-sa-2.0-nl',
                    u'Cc-by-sa-2.0-tw',
                    u'Cc-by-sa-2.0-uk',
                    u'Cc-by-sa-2.1-au',
                    u'Cc-by-sa-2.1-es',
                    u'Cc-by-sa-2.1-jp',
                    u'Cc-by-sa-2.5',
                    u'CC-BY-SA-2.5',
                    u'Cc-by-sa-2.5-ar',
                    u'Cc-by-sa-2.5-au',
                    u'Cc-by-sa-2.5-bg',
                    u'Cc-by-sa-2.5-br',
                    u'Cc-by-sa-2.5-ca',
                    u'Cc-by-sa-2.5-ch',
                    u'Cc-by-sa-2.5-cl',
                    u'Cc-by-sa-2.5-cn',
                    u'Cc-by-sa-2.5-de',
                    u'Cc-by-sa-2.5-dk',
                    u'Cc-by-sa-2.5-es',
                    u'Cc-by-sa-2.5-hu',
                    u'Cc-by-sa-2.5-in',
                    u'Cc-by-sa-2.5-it',
                    u'Cc-by-sa-2.5-mx',
                    u'Cc-by-sa-2.5-my',
                    u'Cc-by-sa-2.5-nl',
                    u'Cc-by-sa-2.5-pl',
                    u'Cc-by-sa-2.5-pt',
                    u'Cc-by-sa-2.5-se',
                    u'Cc-by-sa-2.5-si',
                    u'Cc-by-sa-2.5-tw',
                    u'Cc-by-sa-2.5,1.0',
                    u'Cc-by-sa-2.5,2.0,1.0',
                    u'Cc-by-sa-2.5,2.0,1.0-no-link',
                    u'Cc-by-sa-3.0',
                    u'Cc-by-sa-3.0-gr',
                    u'Cc-by-sa-3.0-nl',
                    u'Cc-by-sa-3.0-rs',
                    u'Cc-by-sa-3.0-tw',
                    u'Cc-by-sa-3.0-us',
                    u'Cc-by-sa-3.0,2.5,2.0,1.0',
                    u'Cc-by-sa-3.0,2.5,2.0,1.0-no-link',
                    u'Cc-by-sa-all',
                    u'Cc-by-sa-jul',
                    u'CC-LukeFord',
                    u'Cc-pd',
                    u'Cc-sa-1.0',
                    u'Cdo',
                    u'Ce',
                    u'Ceb',
                    u'CeCILL',
                    u'CERN-CMS',
                    u'Ch',
                    u'China-PD',
                    u'Cho',
                    u'Chr',
                    u'Chuck',
                    u'Chy',
                    u'Cityview',
                    u'Cityview2',
                    u'Civertan license',
                    u'Claude',
                    u'CNG',
                    u'Co',
                    u'Coa-Germany-b1945',
                    u'Coloured SVG boxes',
                    u'Common Public License',
                    u'Contact-VP',
                    u'Convert to SVG',
                    u'CopyAttribEmail',
                    u'Copyright by Wikimedia',
                    u'Copyright jalpeyrie',
                    u'Copyrighted free use',
                    u'Copyrighted free use provided that',
                    u'Copyrighted IOC',
                    u'CopyrightedFreeUse-Link',
                    u'Cr',
                    u'Created by ForrestSjap',
                    u'Created with Inkscape',
                    u'Creator',
                    u'Credits-panoramafotos.net',
                    u'Crh',
                    u'Crh-cyrl',
                    u'Croatian currency',
                    u'Cs',
                    u'Csb',
                    u'Cu',
                    u'Cv',
                    u'Cy',
                    u'Cz',
                    u'Da',
                    u'De',
                    u'De-cc-by-sa-2.0',
                    u'Debora Cordeiro',
                    u'Diq',
                    u'DMonniaux',
                    u'DMonniaux-DADVSI-20060507',
                    u'Dsb',
                    u'DSL',
                    u'Dum',
                    u'Dv',
                    u'Dz',
                    u'EdwardCurtis',
                    u'Ee',
                    u'EEK banknote',
                    u'EEK coin',
                    u'El',
                    u'Elephants Dream',
                    u'Eml',
                    u'En',
                    u'En icon',
                    u'Eo',
                    u'EPL',
                    u'Erin Silversmith Licence',
                    u'Es',
                    u'EST-Land Board',
                    u'Estremeñu',
                    u'Et',
                    u'Eu',
                    u'EU location',
                    u'Euro coin common face',
                    u'Europe location',
                    u'Expat',
                    u'Ext',
                    u'Fa',
                    u'FAL',
                    u'Fancyfootworklicense',
                    u'Faroe stamps',
                    u'Fcb981c',
                    u'Ff',
                    u'Fi',
                    u'FirefoxWiki',
                    u'Fiu-vro',
                    u'Fj',
                    u'Flag-Germany-b1945',
                    u'Flickr',
                    u'Flickr-change-of-license',
                    u'Flickr-unfree-but',
                    u'Flickrreview',
                    u'Fo',
                    u'FOLP',
                    u'FOP',
                    u'Fr',
                    u'Fr icon',
                    u'Frc',
                    u'Free screenshot',
                    u'Frp',
                    u'Fur',
                    u'FWL',
                    u'Fy',
                    u'Ga',
                    u'Gag',
                    u'Gakk Copyright',
                    u'Gan',
                    u'Gd',
                    u'Geograph',
                    u'GFDL',
                    u'GFDL or cc-by-nc-sa',
                    u'GFDL or cc-by-nc-sa/2.5',
                    u'GFDL-1.2',
                    u'GFDL-1.2-en',
                    u'GFDL-CC-triple',
                    u'GFDL-DD',
                    u'GFDL-en',
                    u'GFDL-GMT',
                    u'GFDL-Institut de Qualitat Agroalimentària',
                    u'GFDL-IS',
                    u'GFDL-it',
                    u'GFDL-ja',
                    u'GFDL-Landsat-Kashmir3d',
                    u'GFDL-OpenGeoDB',
                    u'GFDL-retouched',
                    u'GFDL-Samoborac',
                    u'GFDL-self',
                    u'GFDL-Self',
                    u'GFDL-self-en',
                    u'GFDL-user',
                    u'GFDL-user-als',
                    u'GFDL-user-ar',
                    u'GFDL-user-bat-smg',
                    u'GFDL-user-bs',
                    u'GFDL-user-cs',
                    u'GFDL-user-da',
                    u'GFDL-user-de',
                    u'GFDL-user-el',
                    u'GFDL-user-en',
                    u'GFDL-user-en-no-disclaimers',
                    u'GFDL-user-en-note',
                    u'GFDL-user-en-with-disclaimers',
                    u'GFDL-user-es',
                    u'GFDL-user-fa',
                    u'GFDL-user-fi',
                    u'GFDL-user-fr',
                    u'GFDL-user-gl',
                    u'GFDL-user-he',
                    u'GFDL-user-hi',
                    u'GFDL-user-hu',
                    u'GFDL-user-id',
                    u'GFDL-user-it',
                    u'GFDL-user-ja',
                    u'GFDL-user-ko',
                    u'GFDL-user-lt',
                    u'GFDL-user-nl',
                    u'GFDL-user-nn',
                    u'GFDL-user-no',
                    u'GFDL-user-pl',
                    u'GFDL-user-pt',
                    u'GFDL-user-ru',
                    u'GFDL-user-sk',
                    u'GFDL-user-sq',
                    u'GFDL-user-tr',
                    u'GFDL-user-uk',
                    u'GFDL-user-vi',
                    u'GFDL-user-vls',
                    u'GFDL-user-w',
                    u'GFDL-user-zh',
                    u'Giovannino Copyright',
                    u'Gl',
                    u'Glk',
                    u'Gloumouth1Credit',
                    u'Gn',
                    u'GNOME-icon-theme',
                    u'Got',
                    u'GPL',
                    u'GPLv2 only',
                    u'GPLv3',
                    u'Gr',
                    u'Grays Anatomy plate',
                    u'Gu',
                    u'Gv',
                    u'GWArt',
                    u'GWArtOld',
                    u'GWPDA',
                    u'Ha',
                    u'HAER',
                    u'Hak',
                    u'Halibutt Copyright GFDL',
                    u'Halibutt Copyright Ogg',
                    u'HALS',
                    u'Harry',
                    u'Harry2',
                    u'Haw',
                    u'He',
                    u'Heraldic Badge',
                    u'Hi',
                    u'Hiuppo Copyright GFDL',
                    u'Ho',
                    u'Hr',
                    u'Hsb',
                    u'Ht',
                    u'Hu',
                    u'Hy',
                    u'Hz',
                    u'Ia',
                    u'Ibiblio-Hyperwar.org',
                    u'Icelandic currency',
                    u'Icelandic stamp',
                    u'Id',
                    u'Ie',
                    u'Ig',
                    u'Ii',
                    u'Ik',
                    u'Ike-latn',
                    u'Ilo',
                    u'ImageUpload',
                    u'Img-confirmation',
                    u'INewton',
                    u'Information',
                    u'Information Picswiss',
                    u'Inkscape',
                    u'Insignia',
                    u'Insignia Catalonia',
                    u'Insignia Navarre',
                    u'Io',
                    u'IPPAR',
                    u'Is',
                    u'It',
                    u'It icon',
                    u'Iu',
                    u'Ja',
                    u'Ja2',
                    u'Jbo',
                    u'Jean-PolGRANDMONTCredit',
                    u'JewishEncyclopedia',
                    u'Joergens.mi licence',
                    u'Jv',
                    u'Ka',
                    u'Kaa',
                    u'Kab',
                    u'Kameno doba',
                    u'Kg',
                    u'Ki',
                    u'Kirkeinfo',
                    u'Kirkenorge',
                    u'Kj',
                    u'Kk',
                    u'Kl',
                    u'Km',
                    u'Kn',
                    u'Ko',
                    u'Kopimi',
                    u'Kr',
                    u'Krj',
                    u'Ks',
                    u'Ksh',
                    u'Ku',
                    u'Kv',
                    u'Kw',
                    u'Ky',
                    u'La',
                    u'LA2-Blitz',
                    u'Lad',
                    u'Lan',
                    u'LarsenCopyright',
                    u'Lb',
                    u'Lbe',
                    u'Lfn',
                    u'Lg',
                    u'LGPL',
                    u'Li',
                    u'LibriVox public domain',
                    u'License',
                    u'Lij',
                    u'LinuxeristCopyright',
                    u'Lld',
                    u'Lmo',
                    u'Ln',
                    u'Lo',
                    u'LOC-image',
                    u'LOC-pchrom',
                    u'LOC-prok',
                    u'LOC-prokc',
                    u'Location',
                    u'Location dec',
                    u'Location dms',
                    u'LocationRequired',
                    u'Lothar1976',
                    u'Loz',
                    u'Ls',
                    u'Lt',
                    u'Lueger',
                    u'Lv',
                    u'LviatourCredit',
                    u'Map of Japan-Shigenobu AOKI',
                    u'Map-Austria-GNu',
                    u'Marine-marchande.net',
                    u'MartinX',
                    u'Master son',
                    u'MdB',
                    u'Mdf',
                    u'Met.no',
                    u'Mg',
                    u'Mh',
                    u'Mi',
                    u'Mildenhall',
                    u'MindInfo',
                    u'MIT',
                    u'Mk',
                    u'Ml',
                    u'MLDoan',
                    u'Mn',
                    u'Mo',
                    u'MoengCredit',
                    u'Money-EU banknote',
                    u'Money-Eu',
                    u'Money-REAL',
                    u'MORS',
                    u'MPL',
                    u'Mr',
                    u'Ms',
                    u'Mt',
                    u'MTL',
                    u'Museum.ru',
                    u'My',
                    u'Myv',
                    u'Mzn',
                    u'Na',
                    u'Nah',
                    u'Namespace',
                    u'NAMESPACE',
                    u'Nap',
                    u'NAUMANN',
                    u'Nb',
                    u'Nds',
                    u'Nds-nl',
                    u'Ne',
                    u'NetMarine',
                    u'New',
                    u'Newsflash Photo',
                    u'Ng',
                    u'NGC7000',
                    u'NGruev',
                    u'NGW',
                    u'Ngw2',
                    u'Nickshanks-cc-by-2.0-email',
                    u'Njegos.org',
                    u'Nl',
                    u'Nl icon',
                    u'Nn',
                    u'Nn icon',
                    u'No',
                    u'No icon',
                    u'Non',
                    u'Norges Golfforbund',
                    u'Norwegian coat of arms',
                    u'Not-PD-US-URAA',
                    u'Nov',
                    u'Nrbelex Photo',
                    u'Nrbelex Photo 400D',
                    u'Nrm',
                    u'Nso',
                    u'Nv',
                    u'Ny',
                    u'NYC Subway map',
                    u'OAL',
                    u'Oc',
                    u'OldOS',
                    u'Olessi Copyright Ogg',
                    u'Om',
                    u'Open Font',
                    u'Openphotoreview',
                    u'Or',
                    u'Originally uploaded',
                    u'Os',
                    u'OsborneFossils',
                    u'OTrondal',
                    u'OTRS',
                    u'Otrs pending',
                    u'OTRS pending',
                    u'Pa',
                    u'Pag',
                    u'PAGENAME',
                    u'PAGENAMEE',
                    u'Painting',
                    u'Pam',
                    u'Pap',
                    u'Parlament.ch',
                    u'PAshieldsource',
                    u'PBresseler',
                    u'PCL',
                    u'PD',
                    u'PD Colombia',
                    u'PD patents',
                    u'PD-1923',
                    u'PD-AB-exempt',
                    u'PD-Abdul Hamid',
                    u'PD-AIGA',
                    u'PD-Albania-exempt',
                    u'PD-Algeria',
                    u'PD-AM-exempt',
                    u'PD-ancient-script',
                    u'PD-AR-Anonymous',
                    u'PD-AR-Movie',
                    u'PD-AR-Photo',
                    u'PD-Archivesnormandie',
                    u'PD-Armenia',
                    u'PD-Art',
                    u'PD-art',
                    u'PD-art-life-70',
                    u'PD-art-US',
                    u'PD-Art-YorckProject',
                    u'PD-Australia',
                    u'PD-AustrianGov',
                    u'PD-author',
                    u'PD-AZ-exempt',
                    u'PD-Azerbaijan',
                    u'PD-Bahrain',
                    u'PD-Bain',
                    u'PD-Bangladesh',
                    u'PD-because',
                    u'PD-BH-exempt',
                    u'PD-BnFMandragorePic',
                    u'PD-Brady-Handy',
                    u'PD-Brazil-media',
                    u'PD-BrazilGov',
                    u'PD-Britannica',
                    u'PD-Brockhaus&Efron',
                    u'PD-BulgarianGov',
                    u'PD-BW',
                    u'PD-BY-exempt',
                    u'PD-Canada',
                    u'PD-Canada-creator',
                    u'PD-Canada-Crown',
                    u'PD-Canada-photo',
                    u'PD-Canada-stamp',
                    u'PD-Challenger Report',
                    u'PD-chem',
                    u'PD-Chile',
                    u'PD-China',
                    u'PD-Coa-Finland',
                    u'PD-Coa-Germany',
                    u'PD-Coa-Hungary',
                    u'PD-Coins-Krenzer',
                    u'PD-collective anonymous work',
                    u'PD-copyright holder',
                    u'PD-Croatia',
                    u'PD-CroatiaGov',
                    u'PD-CSIRO',
                    u'PD-Cuba',
                    u'PD-CzechGov',
                    u'PD-DAUI',
                    u'PD-DBZ stamps',
                    u'PD-Demis',
                    u'PD-Denmark50',
                    u'PD-DenmarkEVH',
                    u'PD-Detroit',
                    u'PD-Deutsche Bundespost stamps',
                    u'PD-Edison Records',
                    u'PD-EE-exempt',
                    u'PD-EEA',
                    u'PD-Egypt',
                    u'PD-EstoniaPub',
                    u'PD-EU-no author disclosure',
                    u'PD-Feldman-1905',
                    u'PD-Fiji',
                    u'PD-Finland',
                    u'PD-Finland50',
                    u'PD-FinlandGov',
                    u'PD-flag',
                    u'PD-Flag',
                    u'PD-flag-50',
                    u'PD-Flag-Germany',
                    u'PD-FLGov',
                    u'PD-font',
                    u'PD-FOP-DE',
                    u'PD-Fröléens konversationslexikon',
                    u'PD-GallicaPic',
                    u'PD-GDR stamps',
                    u'PD-GE-exempt',
                    u'PD-Generic',
                    u'PD-German Empire stamps',
                    u'PD-German postmarks',
                    u'PD-German stamps',
                    u'PD-GermanGov',
                    u'PD-Google books',
                    u'PD-Gottscho',
                    u'PD-GreekGov',
                    u'PD-Gutenberg',
                    u'PD-heirs',
                    u'PD-Highsmith',
                    u'PD-HK',
                    u'PD-HK-PR',
                    u'PD-HU-exempt',
                    u'PD-Hubble',
                    u'PD-IDGov',
                    u'PD-IDOld-Art29',
                    u'PD-IDOld-Art30',
                    u'PD-imf.org',
                    u'PD-India',
                    u'PD-ineligible',
                    u'PD-Internationale',
                    u'PD-Iran',
                    u'PD-Iraq',
                    u'PD-Ireland',
                    u'PD-IrishGov',
                    u'PD-Israel',
                    u'PD-Israel-Photo',
                    u'PD-ItalyGov',
                    u'PD-Japan',
                    u'PD-Japan-exempt',
                    u'PD-Japan-film',
                    u'PD-Japan-oldphoto',
                    u'PD-Japan-organization',
                    u'PD-Jordan',
                    u'PD-Jordan-Photo',
                    u'PD-JORF',
                    u'PD-JORF-nor-conso',
                    u'PD-Kenya',
                    u'PD-KG-exempt',
                    u'PD-Kuwait',
                    u'PD-KZ-exempt',
                    u'PD-Lebanon',
                    u'PD-Libya',
                    u'PD-link',
                    u'PD-LOC',
                    u'PD-Look',
                    u'PD-LosAlamos',
                    u'PD-Lozinski',
                    u'PD-LT-exempt',
                    u'PD-LV-exempt',
                    u'PD-MacaoGov',
                    u'PD-magic',
                    u'PD-Malawi',
                    u'PD-Manchukuo-stamps',
                    u'PD-MapLibrary',
                    u'PD-Mauritius',
                    u'PD-MD-exempt',
                    u'PD-Mexico',
                    u'PD-Mexico-NIP',
                    u'PD-Meyers',
                    u'PD-Meyers-5th-edition',
                    u'PD-Meyers-6th-edition',
                    u'PD-MNGov',
                    u'PD-MO',
                    u'PD-money-Romania',
                    u'PD-Morocco',
                    u'PD-Namibia',
                    u'PD-National Photo Company',
                    u'PD-Nigeria',
                    u'PD-NL-gemeentevlag',
                    u'PD-NL-gemeentewapen',
                    u'PD-NL-Gov',
                    u'PD-NL-verkeersbord',
                    u'PD-Nordens Flora',
                    u'PD-North Korea',
                    u'PD-Norway50',
                    u'PD-NorwayGov',
                    u'PD-NTBB',
                    u'PD-NZ',
                    u'PD-NZ-50-years',
                    u'PD-old',
                    u'Pd-old',
                    u'PD-Old',
                    u'PD-old-100',
                    u'PD-old-50',
                    u'PD-old-70',
                    u'PD-old-75',
                    u'PD-old-80',
                    u'PD-old-Edition',
                    u'PD-Oman',
                    u'PD-OpenClipart',
                    u'PD-Orgelbrand',
                    u'PD-Ornament1898',
                    u'PD-Pakistan',
                    u'PD-PCL-portraits',
                    u'PD-PDFnet',
                    u'PD-PDphoto.org',
                    u'PD-Peru',
                    u'PD-Philippines',
                    u'PD-PhilippinesPubDoc',
                    u'PD-PMR-exempt',
                    u'PD-Polish',
                    u'PD-Polishsymbol',
                    u'PD-PRC-exempt',
                    u'PD-PT',
                    u'PD-retouched-user',
                    u'PD-retouched-user-w',
                    u'PD-RO-exempt',
                    u'PD-ROC-exempt',
                    u'PD-ROC-Traffic Indicating Lines',
                    u'PD-ROC-Traffic Signs',
                    u'PD-RU-exempt',
                    u'PD-RusEmpire',
                    u'PD-Russia',
                    u'PD-Russia-2008',
                    u'PD-SAGov',
                    u'PD-Saudi Arabia',
                    u'PD-SBH',
                    u'PD-scan',
                    u'PD-SCGGov',
                    u'PD-ScottForesman',
                    u'PD-ScottForesman-raw',
                    u'PD-script',
                    u'PD-Seal-Germany',
                    u'PD-Seattle-Neighborhood-Atlas',
                    u'PD-SeaWiFS',
                    u'PD-self',
                    u'PD-self2',
                    u'PD-SerbiaGov',
                    u'PD-Seychelles',
                    u'PD-SFJ',
                    u'PD-shape',
                    u'PD-Sjöfartsverket',
                    u'PD-SlovakGov',
                    u'PD-South Korea',
                    u'PD-South-Africa',
                    u'PD-Soviet-revised',
                    u'PD-SRBGov',
                    u'PD-STFP',
                    u'PD-StVZVO',
                    u'PD-Sudan',
                    u'PD-Suomen',
                    u'PD-Sweden',
                    u'PD-Sweden-1969',
                    u'PD-Sweden-photo',
                    u'PD-Sweden-self',
                    u'PD-Switzerland-official',
                    u'PD-Switzerland-photo',
                    u'PD-Syria',
                    u'PD-Taiwan',
                    u'PD-text',
                    u'PD-textlogo',
                    u'PD-TH-exempt',
                    u'PD-Thailand',
                    u'PD-TJ-exempt',
                    u'PD-TK-exempt',
                    u'PD-TR-Gov',
                    u'PD-Traditional',
                    u'PD-Tunisia',
                    u'PD-UA-exempt',
                    u'PD-UEA',
                    u'PD-Uganda',
                    u'PD-Ugglan',
                    u'PD-UK-known',
                    u'PD-UK-unknown',
                    u'PD-UKGov',
                    u'PD-Ukraine',
                    u'PD-UN',
                    u'PD-United Arab Emirates',
                    u'PD-URAA',
                    u'PD-Uruguay',
                    u'PD-US',
                    u'PD-US-1978-89',
                    u'PD-US-flag',
                    u'PD-US-no notice',
                    u'PD-US-not renewed',
                    u'PD-US-patent',
                    u'PD-US-patent-no notice',
                    u'PD-US-record',
                    u'PD-user',
                    u'PD-User',
                    u'PD-user-als',
                    u'PD-user-ar',
                    u'PD-user-ca',
                    u'PD-user-cs',
                    u'PD-user-da',
                    u'PD-user-de',
                    u'PD-user-en',
                    u'PD-user-fa',
                    u'PD-user-fr',
                    u'PD-user-he',
                    u'PD-user-hi',
                    u'PD-user-hr',
                    u'PD-user-hu',
                    u'PD-user-it',
                    u'PD-user-ja',
                    u'PD-user-lt',
                    u'PD-user-nl',
                    u'PD-user-nn',
                    u'PD-user-no',
                    u'PD-user-pl',
                    u'PD-user-pt',
                    u'PD-user-ro',
                    u'PD-user-ru',
                    u'PD-user-sk',
                    u'PD-user-sl',
                    u'PD-user-th',
                    u'PD-user-uk',
                    u'PD-user-vls',
                    u'PD-user-w',
                    u'PD-user-zh',
                    u'PD-USGov',
                    u'PD-USGov-ARM',
                    u'PD-USGov-Atlas',
                    u'PD-USGov-Award',
                    u'PD-USGov-BLM',
                    u'PD-USGov-CIA',
                    u'PD-USGov-CIA-WF',
                    u'PD-USGov-Congress',
                    u'PD-USGov-Congress-AOC',
                    u'PD-USGov-Congress-Bio',
                    u'PD-USGov-DEA',
                    u'PD-USGov-DHS',
                    u'PD-USGov-DHS-CG',
                    u'PD-USGov-DHS-CGAUX',
                    u'PD-USGov-DOC',
                    u'PD-USGov-DOC-Census',
                    u'PD-USGov-DOE',
                    u'PD-USGov-DOJ',
                    u'PD-USGov-DOL',
                    u'PD-USGov-DOS',
                    u'PD-USGov-DOT',
                    u'PD-USGov-DVA',
                    u'PD-USGov-ED',
                    u'PD-USGov-EPA',
                    u'PD-USGov-FAA',
                    u'PD-USGov-FBI',
                    u'PD-USGov-FDA',
                    u'PD-USGov-Federal Reserve',
                    u'PD-USGov-FEMA',
                    u'PD-USGov-FSA',
                    u'PD-USGov-FWS',
                    u'PD-USGov-HHS',
                    u'PD-USGov-HHS-CDC',
                    u'PD-USGov-HHS-NIH',
                    u'PD-USGov-Interior',
                    u'PD-USGov-Interior-HABS',
                    u'PD-USGov-Interior-MMS',
                    u'PD-USGov-Interior-USBR',
                    u'PD-USGov-Interior-USGS-Minerals',
                    u'PD-USGov-Military',
                    u'PD-USGov-Military award',
                    u'PD-USGov-Military-Air Force',
                    u'PD-USGov-Military-Air Force Auxiliary',
                    u'PD-USGov-Military-Army',
                    u'PD-USGov-Military-Army-USACE',
                    u'PD-USGov-Military-Army-USACMH',
                    u'PD-USGov-Military-Army-USAIOH',
                    u'PD-USGov-Military-Badge',
                    u'PD-USGov-Military-Coast Guard',
                    u'PD-USGov-Military-DVIC',
                    u'PD-USGov-Military-Marines',
                    u'PD-USGov-Military-MDA',
                    u'PD-USGov-Military-National Guard',
                    u'PD-USGov-Military-Navy',
                    u'PD-USGov-Military-NGA',
                    u'PD-USGov-money',
                    u'PD-USGov-MUTCD',
                    u'PD-USGov-NASA',
                    u'PD-USGov-NASA/copyright',
                    u'PD-USGov-NCBI-scienceprimer',
                    u'PD-USGov-NIH',
                    u'PD-USGov-NIST',
                    u'PD-USGov-NOAA',
                    u'PD-USGov-NPS',
                    u'PD-USGov-NRO',
                    u'PD-USGov-NSA',
                    u'PD-USGov-NSF',
                    u'PD-USGov-NTSB',
                    u'PD-USGov-POTUS',
                    u'PD-USGov-State',
                    u'PD-USGov-Treasury',
                    u'PD-USGov-TVA',
                    u'PD-USGov-USAID',
                    u'PD-USGov-USDA',
                    u'PD-USGov-USDA-ARS',
                    u'PD-USGov-USDA-FS',
                    u'PD-USGov-USDA-NAL',
                    u'PD-USGov-USDA-NRCS',
                    u'PD-USGov-USGS',
                    u'PD-USGov-USIA',
                    u'PD-USGov-VOA',
                    u'PD-USGov-WPA',
                    u'PD-USNWR',
                    u'PD-UZ-exempt',
                    u'PD-Van Vechten',
                    u'PD-Vegagerdin',
                    u'PD-Venezuela',
                    u'PD-Vietnam',
                    u'PD-VL-shield',
                    u'PD-Vlaams-gemeentewapen',
                    u'PD-Vlaamse-gemeentevlag',
                    u'PD-VzKat',
                    u'PD-WorldWind',
                    u'PD-Yemen',
                    u'PD-Yugoslavia',
                    u'PD-Zimbabwe',
                    u'Pd',
                    u'Pdc',
                    u'Peregrine981',
                    u'PermissionOTRS',
                    u'PermissionOTRS-ID',
                    u'Personality rights',
                    u'Photo-by-Wojciechowscy-GFDL',
                    u'Photocity.ru',
                    u'PhotoManifs-PP',
                    u'Photos by Bagn Bygdesamling',
                    u'Photos by Kulturhistorisk museum',
                    u'Photos by Stortinget',
                    u'Photos by the Norwegian Museum of Cultural History',
                    u'Pi',
                    u'Picswiss',
                    u'Piratpartiet',
                    u'Pl',
                    u'Pl icon',
                    u'PLoS',
                    u'Pms',
                    u'Pnt',
                    u'Polish coats of arms by Tadeusz Gajl',
                    u'PolishPresidentCopyright',
                    u'PolishSenateCopyright',
                    u'Polishsymbol',
                    u'Politas FZ30',
                    u'Portpictures.nl',
                    u'Pousbeeld',
                    u'Pressefotos Die Gruenen',
                    u'Ps',
                    u'Pt',
                    u'Pt icon',
                    u'Pt-br',
                    u'Qu',
                    u'QualityImage',
                    u'RadioSenadoBr',
                    u'RetouchedPicture',
                    u'Rm',
                    u'Rmy',
                    u'Rn',
                    u'Ro',
                    u'Roa-rup',
                    u'RomanianMCTICopyright',
                    u'RTCNCA License',
                    u'Rtl-lang',
                    u'Ru',
                    u'Rw',
                    u'Sa',
                    u'Sah',
                    u'Sc',
                    u'Scn',
                    u'Sco',
                    u'Sd',
                    u'Sdc',
                    u'Se',
                    u'Seattle Neighborhood Atlas disclaimer',
                    u'Second Life',
                    u'Sei',
                    u'SejmCopyright',
                    u'Self',
                    u'Self2',
                    u'Self2-name',
                    u'Self-GFDL-German',
                    u'SelfSA-GFDL-German',
                    u'SenadoMexico',
                    u'Sergeymila',
                    u'Sg',
                    u'SgiraldoaCredit',
                    u'Sh',
                    u'Shi',
                    u'Si',
                    u'SIB',
                    u'Simple',
                    u'Simple English',
                    u'Sk',
                    u'Sl',
                    u'Sm',
                    u'Sma',
                    u'Sn',
                    u'So',
                    u'SOlicense',
                    u'Solkoll',
                    u'Solkoll 2D',
                    u'Solkoll 3D',
                    u'South Korean currency',
                    u'SpaceShuttle',
                    u'SPD-Parteivorstand',
                    u'Spui',
                    u'Spuiother',
                    u'Sq',
                    u'Sr',
                    u'Srn',
                    u'Ss',
                    u'St',
                    u'Stan Shebs photo',
                    u'Stationsweb',
                    u'Statistics Netherlands map',
                    u'Stielers Handatlas 1891',
                    u'Stortinget3',
                    u'Stq',
                    u'Stratosphere',
                    u'Su',
                    u'SupersededPNG',
                    u'SupersededSVG',
                    u'Sv',
                    u'Svensk porträttgalleri',
                    u'Svg',
                    u'SVG',
                    u'SVG-Map Africa by Slomox',
                    u'Sw',
                    u'Swiss Government Portrait',
                    u'SygnaturaPixela',
                    u'Szl',
                    u'Ta',
                    u'Tango',
                    u'Taxonavigation',
                    u'Tcolphoto',
                    u'Te',
                    u'Texas State Highway',
                    u'Tet',
                    u'Tg',
                    u'Tgl',
                    u'Tintazul',
                    u'Th',
                    u'ThomasBredolCredit2',
                    u'ThomasBredolCredit3',
                    u'Ti',
                    u'Tk',
                    u'Tl',
                    u'Tlx',
                    u'Tn',
                    u'To',
                    u'TomCorserCredit',
                    u'Tpi',
                    u'Tr',
                    u'Trademark',
                    u'Trademarked',
                    u'Ts',
                    u'Tt',
                    u'Tum',
                    u'TVSenadoBr',
                    u'Tw',
                    u'Ty',
                    u'Tyv',
                    u'Udm',
                    u'Ug',
                    u'Uk',
                    u'UN map',
                    u'Ur',
                    u'User:FlickreviewR/reviewed-pass',
                    u'User:Fir0002/20D',
                    u'USDA',
                    u'UWiscCIMSS',
                    u'Uz',
                    u'Ve',
                    u'Vec',
                    u'Vector-Images.com',
                    u'Vector version available',
                    u'Vi',
                    u'Viollet-le-Duc',
                    u'Vl',
                    u'Vls',
                    u'Vo',
                    u'W',
                    u'Wa',
                    u'Walks.ru',
                    u'War',
                    u'WEF',
                    u'Wikimedia relicensing',
                    u'Wikipedia-screenshot',
                    u'Wikiportrait',
                    u'Wikispecies',
                    u'Wo',
                    u'Wulfstan GFDL',
                    u'Wuu',
                    u'Www.bordeaux-port.fr',
                    u'Www.folketinget.dk',
                    u'Www.hotelviewarea.com',
                    u'Www.nordenskirker.dk',
                    u'Xal',
                    u'XGSC image',
                    u'Xh',
                    u'YAM',
                    u'Ydd',
                    u'Yi',
                    u'Yo',
                    u'Yue',
                    u'Za',
                    u'Zea',
                    u'Zh',
                    u'Zh-classical',
                    u'Zh-cn',
                    u'Zh-hans',
                    u'Zh-hant',
                    u'Zh-hk',
                    u'Zh-min-nan',
                    u'Zh-sg',
                    u'Zh-tw'
                    u'Zh-yue',
                    u'Zlib',
                    u'Zu',
                    u'Zxx',]

puttext = u'\n{{Uncategorized|year={{subst:CURRENTYEAR}}|month={{subst:CURRENTMONTHNAME}}|day={{subst:CURRENTDAY}}}}'
putcomment = u'Please add categories to this image'

def uploadedYesterday(site = None):
    '''
    Return a pagegenerator containing all the pictures uploaded yesterday.
    Should probably copied to somewhere else
    '''
    result = []
    dateformat ="%Y-%m-%dT00:00:00Z"
    today = datetime.utcnow()
    yesterday = today + timedelta(days=-1)

    params = {
        'action'    :'query',
        'list'      :'logevents',
        'leprop'    :'title',
        'letype'    :'upload',
        'ledir'     :'newer',
        'lelimit'   :'5000',
        'lestart'   :yesterday.strftime(dateformat),
        'leend'     :today.strftime(dateformat)
        }

    data = query.GetData(params, site, useAPI = True, encodeTitle = False)
    try:
        for item in data['query']['logevents']:
            result.append(item['title'])
    except IndexError:
        raise NoPage(u'API Error, nothing found in the APIs')
    except KeyError:
        raise NoPage(u'API Error, nothing found in the APIs')

    return pagegenerators.PagesFromTitlesGenerator(result, site)

def recentChanges(site = None, delay=60, block=70):
    '''
    Return a pagegenerator containing all the images edited in a certain timespan.
    The delay is the amount of minutes to wait and the block is the timespan to return images in.
    Should probably copied to somewhere else
    '''
    
    result = []
    dateformat ="%Y-%m-%dT%H:%M:%SZ"
    rcstart = datetime.utcnow() + timedelta(minutes=-delay-block)
    rcend = datetime.utcnow() + timedelta(minutes=-delay)

    params = {
        'action'    :'query',
        'list'      :'recentchanges',
        'rcstart'   :rcstart.strftime(dateformat),
        'rcend'     :rcend.strftime(dateformat),
        'rcdir'     :'newer',
        'rcnamespace':'6',
        'rcprop'    :'title',
        'rcshow'    :'!bot',
        'rclimit'   :'5000',
        'rctype'    :'edit',
        }

    data = query.GetData(params, site, useAPI = True, encodeTitle = False)
    try:
        for item in data['query']['recentchanges']:
            result.append(item['title'])
    except IndexError:
        raise NoPage(u'API Error, nothing found in the APIs')
    except KeyError:
        raise NoPage(u'API Error, nothing found in the APIs')

    return pagegenerators.PagesFromTitlesGenerator(result, site)

def isUncat(page):
    '''
    Do we want to skip this page?

    If we found a category which is not in the ignore list it means that the page is categorized so skip the page.
    If we found a template which is in the ignore list, skip the page.
    '''
    wikipedia.output(u'Working on '+ page.title())

    for category in page.categories():
        if category not in ignoreCategories:
            wikipedia.output(u'Got category ' + category.title())
            return False

    for templateWithTrail in page.templates():
        #Strip of trailing garbage
        template = templateWithTrail.rstrip('\n').rstrip()
        if template in skipTemplates:
            # Already tagged with a template, skip it
            wikipedia.output(u'Already tagged, skip it')
            return False
        elif template in ignoreTemplates:
            # template not relevant for categorization
            wikipedia.output(u'Ignore ' + template)
        else:
            wikipedia.output(u'Not ignoring ' + template)
            return False
    return True

def addUncat(page):
    '''
    Add the uncat template to the page
    '''
    newtext = page.get() + puttext
    wikipedia.showDiff(page.get(), newtext)
    try:
        page.put(newtext, putcomment)
    except wikipedia.EditConflict:
        # Skip this page
        pass
    except wikipedia.LockedPage:
        # Skip this page
        pass
    return

def main(args):
    '''
    Grab a bunch of images and tag them if they are not categorized.
    '''
    generator = None;
    genFactory = pagegenerators.GeneratorFactory()

    site = wikipedia.getSite(u'commons', u'commons')
    wikipedia.setSite(site)
    for arg in wikipedia.handleArgs():
        if arg.startswith('-page'):
            if len(arg) == 5:
                generator = [wikipedia.Page(site, wikipedia.input(u'What page do you want to use?'))]
            else:
                generator = [wikipedia.Page(site, arg[6:])]
        elif arg.startswith('-yesterday'):
            generator = uploadedYesterday(site)
        elif arg.startswith('-recentchanges'):
            generator = recentChanges(site)
        else:
            generator = genFactory.handleArg(arg)
    if not generator:
        wikipedia.output('You have to specify the generator you want to use for the program!')
    else:
        pregenerator = pagegenerators.PreloadingGenerator(generator)
        for page in pregenerator:
            if page.exists() and (page.namespace() == 6) and (not page.isRedirectPage()) :
                if isUncat(page):
                    addUncat(page)

if __name__ == "__main__":
    try:
        main(sys.argv[1:])
    finally:
        wikipedia.stopme()
